<template>
<div class="image-container">
  <el-card class='box-card'>
    <div slot="header" class='clearfix'>
      <Breadcrumb>素材管理</Breadcrumb>
      <Breadcrumb>内容管理</Breadcrumb>
    </div>
    <div style="padding-bottom: 20px;">
      <el-radio-group v-model="isCollected" size="mini" @change='hCollcet'>
        <el-radio-button :label="false">全部</el-radio-button>
        <el-radio-button :label="true">收藏</el-radio-button>
      </el-radio-group>
    </div>
  <!-- 素材列表 -->
      <!--gutter表示列与列之间的间隔
          :span="4" 如果一行有24份，表示一行被平均分成4份，如果不足，则另起一行 -->
    <el-row :gutter="10">
      <el-col  class="img_item" v-for=" (img, index) in images" :key="img.id" :span="4">
        <el-image
          style="height: 180px;width: 180px"
          :src="img.url"
          fit="cover"> 
        </el-image>
        <!-- 收藏和删除图标的操作 -->
        <div class="option" v-show="!isCollected">
          <span class="el-icon-star-off" :class="{'red':image.is_collected}"></span>
          <span class="el-icon-delete" @click="hDelete(img.id, index)"></span>
        </div> 
      </el-col>
    </el-row>
    <!-- 列表分页 
            total：一共有多少条数据
            background：是否设置背景
            page-size：每页多少条，默认10条
            current-changes事件。当点击页码时，他会触发并会传入当前的页码-->
    <el-pagination
        v-show="total_count>10"
        :disabled="isLoading"
        style="margin-top:10px;"
        layout="prev, pager, next"
        background
        @current-change="hPageChange"
        :total="total_count">
      </el-pagination>
    </el-card>

    <!-- 上传图片素材对话框
    :visible.sync="dialogVisible"   用来控制是否显示对话框，boolean值
    append-to-body  表示遮罩层是否插入body元素上，boolean值-->
    <el-dialog
      append-to-body
      title="上传素材"
      :visible.sync="dialogVisible">
<!--el-upload：上传图片用。
- action： 必选参数，上传的地址：http://ttapi.research.itcast.cn/mp/v1_0/user/images
- headers: 设置上传的请求头部。要携带token
- name：上传的文件字段名。要与接口中要求保持一致。
- show-file-list： 是否显示已上传文件列表
- on-success：文件上传成功时的钩子。`function(response, file, fileList)`
- before-upload: 上传之前对文件进行检测。 -->
      <el-upload
        class="avatar-uploader"
        action="http://ttapi.research.itcast.cn/mp/v1_0/user/images"
        :headers="headers"
        name="image"
        :show-file-list="false"
        :on-success="handleAvatarSuccess"
        :before-upload="beforeAvatarUpload">
          <!--如果成功就是el-image 如果失败就是i  -->
        <el-image v-if="imageUrl" :src="imageUrl" @load="hImageLoad" class="avatar" />
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
      </el-upload>
    </el-dialog>
  </div>
</template> 

<script>
// import Breadcrumb from '@/components/Breadcrumb.vue'

export default {
//   components:{
//     Breadcrumb
//   },
  name:'image',
  data (){
    return{
      headers: {
        Authorization:`Bearer ${ localStorage.getIteam ('tokenStr') }`
      },
      dialogVisible: false,
      total_count: 0,
      images:[],  //素材列表
      curPage: 1,
      isCollected: false  //最初选中v-model的全部
    }
  },
  //打开就会执行，用created，生命周期函数中的立即执行
  created () {
    this.loadImages()
  }, 
  methods: {
    async hSwitchCollect (img) {
      console.log(img)
      const { id, is_collected: isCollected } = img
      console.log(id, isCollected)
      try {
        // 1. 调用接口
        const result = await this.$http({
          method: 'PUT',
          url: '/mp/v1_0/user/images/' + id,
          data: {
            collect: !isCollected // 切换 是否收藏
          }
        })
        console.log(result)
        // 2. 更新视图
        // (1) 重新查询
        // this.loadImages()
        // (2) 直接修改数据项
        img.is_collected = !isCollected
        this.$message.success('操作成功')
      } catch (err) {
        console.log(err)
        this.$message.error('操作失败')
      }
    },
    hImageLoad () {
      console.log('hImageLoad');
      //定时器
      setTimeout(() => {
        this.imageUrl = ''
        this.dialogVisible = false  //对话框关闭
      },2000)
    },
    handleAvatarSuccess (res, file) {
      // console.log(res, file)
      // res表示上传成功之后，图片在服务器上的位置信息
      this.imageUrl = res.data.url
      this.$message.success('上传素材成功')
      this.loadImages()
    },
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg';
      // file.size: 大小是字节
      // 1MB = 1024kB
      // 1KB = 1024B

      // 是否小于2
      const isLt2M = (file.size / 1024 / 1024) < 2;

      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG 格式!');
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!');
      }
      // 如果返回是false,则不会做后续的上传
      return isJPG && isLt2M;
    },
    //用户点击删除
    hDelete (id,index) {
      // 1. 做删除，弹窗提示用户确认
      this.$confirm('你确定要删除吗？')
        .then(async () => {
          // 用户点了确定
          try {
            const result = await this.$http({
              url: '/mp/v1_0/user/images/' + id,
              method: 'DELETE'
            })
            console.log(result)
            // 3. 根据接口的反馈信息做后续处理
            // 如果这个操作不报错误，则可以认为是删除成功，
            // 下面要更新页面，有两种方案
            // (1) 再做一次查询(更加严谨，数据是从后端再次求回来的)
            this.loadImages()
            // (2) 不做查询，直接删除当前图片(不做查询)
            this.images.splice(index, 1)
          } catch (err) {
            this.$message.error('删除失败！  ')
          }
        })
        .catch(() => {
          // 用户点了取消
        })
    },
    //收藏和全部绑定的切换
      hCollect () {
        console.log(this.isCollected);
        //重置页码为 1。就是无论点击了第几页，切换后都会跳转到第一页
        this.curPage = 1
        //重发请求
        this.loadImages()
      },
      //点击了分页
      hPageChange(curPage) {
        console.log(curPage);
        //更新页码
        this.curPage = curPage
        //重发请求
        this.loadImages()
      },
      async loadImages () {
        //调用接口
        const result = await this.$http({
          method:'GET',
          url:'/mp/v1_0/user/images',
          params:{
            per_page: 10,
            collcet: this.isCollected,  //是否是收藏
            page: this.curPage
          }
        })
        //保存数据
        this.images = result.data.data.results
        this.total_count = result.data.data.total_count
        console.log(result);
    }
  }
}

</script>

<style lang="less" scoped>
  .img_item {
    position: relative;
    box-sizing: border-box;
  }
  .option {
    position: absolute;
    left: 5px;
    width:180px;
    bottom: 5px;
    height: 30px;
    line-height: 30px;
    background: rgba(0, 0, 0, 0.3);
    text-align: center;
    color: #fff;
    span {
      margin: 0 30px;
      cursor: pointer;
    }
  }
.avatar-uploader {
    text-align: center;
}
.avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
}
.avatar-uploader /deep/ .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
}
</style>